#include <signal.h>
#include "../ourhdr.h"

#define BUFFSIZE 1024
static void sig_tstp(int);


/***
 * 作业控制信号
 * SIGCHLD  子进程已经停止或终止
 * SIGCONT  如果进程己停止，则使其继续运行
 * SIGSTOP  停止信号（不能被捕捉或忽略）
 * SIGTSTP  交互停止信号
 * SIGTTIN  后台进程组成功读控制终端
 * SIGTTOU  后台进程组成功写控制终端
 **/

int main(void)
{
    int n;
    char buf[BUFFSIZE];
    if(signal(SIGTSTP, SIG_IGN)== SIG_DFL)
    {
        signal(SIGTSTP, sig_tstp);
    }
    while((n=read(STDIN_FILENO,buf, BUFFSIZE))>0)
    {
        if(write(STDOUT_FILENO, buf, n)!=n)
        {
            err_sys("write error");
        }
    }
    if(n<0)
    {
        err_sys("read error");
    }
    exit(0);
}

static void sig_tstp(int signo)
{
    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask, SIGTSTP);
    sigprocmask(SIG_UNBLOCK, &mask, NULL);
    signal(SIGTSTP, SIG_DFL);
    kill(getpid(), SIGTSTP);
    signal(SIGTSTP, sig_tstp);
    return;
}
